/**
 * 
 */
package tier2;
import tier1.Abonne;
import tier1.Client;
import tier3.*;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;

import javax.swing.JTextArea;
import javax.swing.ListCellRenderer;




import tier3.Discussion;
import tier3.Message;
import tier3.ServicePersistance;
import tier3.ServicePersistanceService;
import tier3.Utilisateur;

/**
 * @author jonathan
 *
 */
public class ServiceGestionImpl implements ServiceGestion{

	private  LinkedList<Abonne> listAbonne=new LinkedList<Abonne>() ;
	private ServicePersistanceService servicePersistance = new ServicePersistanceService();
	private ServicePersistance port = servicePersistance.getServicePersistancePort();
	private HashMap<String, Abonne> jonctionAbonneUtilisateur=new HashMap<String, Abonne>();
	//private ServicePersistance port;
	private LinkedList<String> listeConnecte=new LinkedList<String>();
	public ServiceGestionImpl( ) throws RemoteException {

	}


	public ServiceGestionImpl(ServicePersistance port) throws RemoteException {
		this.setPort(port);		
	}


	@Override
	public Utilisateur Authentification(String login, String motDePasse,Abonne nvxabonne) 
			throws RemoteException  {
		Utilisateur u= port.authentification(login, motDePasse);


		if(u!=null){
			listeConnecte.add(u.getLogin());
			jonctionAbonneUtilisateur.put(login, nvxabonne);
		}
		else{
			System.out.println("Utilisateur inexistant");
		}

		return u;
	}


	@Override
	public boolean Deconnection(Utilisateur u) throws RemoteException {


		for(int i=0;i<listeConnecte.size();i++){
			if(listeConnecte.get(i)==null){
				System.out.println("objet null");
			}
			if(listeConnecte.get(i).equals(u.getLogin())){
				listeConnecte.remove(i);
			}
		}


		System.out.println("deconection aprés  :"+listeConnecte);
		return true;
	}


	@Override
	public ArrayList<Message> RecuperationHistorique(Utilisateur utilisateur)
			throws RemoteException {
	
		List<Integer> listmesg=port.recuperationHistorique(utilisateur.getLogin());
		ArrayList<Message> listemessage= new ArrayList<Message>(); 
		for(int i=0;i<listmesg.size();i++){		
			Message msg=port.rechercheMessage(listmesg.get(i));
	
			listemessage.add(msg);
		}
		return listemessage;
	
	}



	@Override
	public ArrayList<String> demandeListeConnecte(Utilisateur u)
			throws RemoteException {	

		ArrayList<String> listAmisConnect =new ArrayList<String>();
		List<String> listeAmis = port.listeAmis(u.getLogin());
		for(String connect : listeconnecte()){
			for(String ami: listeAmis){
				if(ami.equals(connect)){

					listAmisConnect.add(connect);
				}
			}
		}
		return listAmisConnect;

	}


	@Override
	public Utilisateur rechercheContacte(String nom) throws RemoteException {
		Utilisateur utilisateur=port.rechercheContact(nom);				
		return utilisateur;
	}


	@Override
	public boolean demandeAjoutContact(String destintataire, Utilisateur demandeur) throws RemoteException {


		boolean ajoutAmis=port.demandeAjoutContact(destintataire, demandeur.getLogin());
		return ajoutAmis;
	}


	@Override
	public boolean SuppressionContact(String loginSupprim, Utilisateur u) throws RemoteException {		
		return port.suppressionContact(loginSupprim, u.getLogin());
	}


	@Override
	public Utilisateur CreationCompte(String nom, String motDePasse)
			throws RemoteException {

		Utilisateur user=new Utilisateur();
		user=(Utilisateur) port.creationCompte(nom, motDePasse);


		return user;
	}


	@Override
	public void EnvoiMessage(String message,String expediteur)
			throws RemoteException {

		for(int i=0;i<listAbonne.size();i++){
			
			try {
			
				this.listAbonne.get(i).messagetest(message,expediteur);			
				int numeroMessage=port.sauvegardeMessage(this.listeConnecte.get(i), expediteur, message);
				
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}
	



	@Override
	public String RecuperationMDP(String login) throws RemoteException {	
		return port.recuperationMDP(login);
	}


	@Override
	public boolean CreationDiscussion(Utilisateur utilisateur1,
			Utilisateur utilisateur2) throws RemoteException {
		// TODO Auto-generated method stub
		return false;
	}


	@Override
	public boolean AjoutPersonneDiscussion(Discussion discussion,
			Utilisateur utilisateur) throws RemoteException {
		// TODO Auto-generated method stub
		return false;
	}

	public ServicePersistance getPort() {
		return port;
	}

	public void setPort(ServicePersistance port) {
		this.port = port;
	}

	public String MethodeTeste(){
		return(port.methodeTest());
	}

	@Override
	public LinkedList<String> listeconnecte()
			throws RemoteException {	

		return this.listeConnecte;

	}

	@Override
	public boolean abonner(Abonne a) throws RemoteException{
		// TODO Auto-generated method stub	
		Iterator<Abonne> list = listAbonne.iterator();
		if (listAbonne.size()!=0){
			while (list.hasNext()) {
				Abonne  abonne= list.next();
				if(abonne.equals(a)){

					return true;
				}
				else{
					listAbonne.add(a);
					return true;
				}
			}
		}
		else{
			listAbonne.add(a);
			return true;
		}		
		return false;
	}


	@Override
	public boolean testUtilisateur(String u) throws RemoteException {
		Utilisateur user=rechercheContacte(u);
		if(user!=null){
			for(String listUtilisateur:listeConnecte){
				if(listUtilisateur.equals(user.getLogin())){
					return true;
				}
			}
			return false;
		}
		else{
			return false;
		}

	}
	
	@Override
	public void EnvoiMessagePrive(String message,String expediteur,String destinataire)
			throws RemoteException {

				//this.listAbonne.get(i).messagetest(message,expediteur);			
				for (Entry<String, Abonne> entry : jonctionAbonneUtilisateur.entrySet())
				{
					if( entry.getKey().equals(destinataire)){				 
				 String messageDest=  entry.getValue().messagePriveDest(message, expediteur);	
				   port.sauvegardeMessage(destinataire, expediteur, messageDest);
					}
					
					if( entry.getKey().equals(expediteur)){				 
						  String messageExpe= entry.getValue().messagePriveExped(message);
						   port.sauvegardeMessage(expediteur, expediteur, messageExpe);
							}
				}
				//int numeroMessage=port.sauvegardeMessage(this.listeConnecte.get(i), expediteur, message);
				
			

		}

	}



